/* 常用正则 Regular.phone.test() */ 
let Regular = {
  phone: /0?(13|14|15|17|18)[0-9]{9}/,  // 手机号
  email: /^\S+?@\S+?\.\S+?$/, // 邮箱
  idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,   // 身份证
}

//  返回 1 - maxNum 的随机数
let random = (maxNum) => {
	let num = Math.random() 
	num = Math.ceil(num * maxNum)    // 随机数 1 - maxNum 的随机数
	return num
}

// 随机数 
let randomScope = (start, end) => {
  // 公式：Math.floor(Math.random() * 可能性数 + 第一个可能值)
  return Math.floor(Math.random() * (end - start + 1) + start)  
}

// base64 转文件格式  base64: 图片base64, filename: 文件名称
function dataURLtoFile(base64, filename) {
	var arr = base64.split(','),
		mime = arr[0].match(/:(.*?);/)[1],
		bstr = atob(arr[1]),
		n = bstr.length,
		u8arr = new Uint8Array(n);
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new File([u8arr], filename, {
		type: mime
	});
}
//随机生成字符串
function randomString(len) {
	len = len || 32;
	var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
	var maxPos = $chars.length;
	var pwd = '';
	for (var i = 0; i < len; i++) {
		pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
	}
	return pwd;
}

// 获取url参数
function getQueryString(name) {
  let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  if(window.location.hash.indexOf("?") < 0){
    return '';
  }
  let r = window.location.hash.split("?")[1].match(reg);
  if (r != null) return decodeURIComponent(r[2]);
  return '';
}

// 获取 字符串连接符 指定值后面的参数  let str = 'id=12&mid=23'     由获取url参数方法演变过来的
function getParam(key,param) {
	var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
	var r = param.match(reg); //匹配目标参数
	if (r != null) return unescape(r[2]);
	return null; //返回参数值
}

// 当前日期加N天  num 追加几天  fmt: 日期格式 YYYY-mm-dd HH:MM:SS
function sjAdd(num = 0,fmt){   // +new Date() === new Date().getTime() 你学废了么
	let time = new Date(+new Date() + 24*60*60*1000*num)
	return dateFormat(time,fmt)
}

// 时间格式转换  YYYY-mm-dd HH:MM:SS
function dateFormat(date,fmt) {
    let ret;
    const opt = {
        "Y+": date.getFullYear().toString(),        // 年
        "m+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "M+": date.getMinutes().toString(),         // 分
        "S+": date.getSeconds().toString()          // 秒
        // 有其他格式化字符需求可以继续添加，必须转化成字符串
    };
    for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		}
	};
    return fmt;
}

/**
 * 将日期格式化成指定格式的字符串
 * @param date 要格式化的日期，不传时默认当前时间，也可以是一个时间戳
 * @param fmt 目标字符串格式，支持的字符有：y,M,d,q,w,H,h,m,S，默认：yyyy-MM-dd HH:mm:ss
 * @returns 返回格式化后的日期字符串
 */
function formatDate(date, fmt) {
	date = date == undefined ? new Date() : date;
	date = typeof date == 'number' ? new Date(date) : date;
	fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
	var obj = {
		'y': date.getFullYear(), // 年份，注意必须用getFullYear
		'M': date.getMonth() + 1, // 月份，注意是从0-11
		'd': date.getDate(), // 日期
		'q': Math.floor((date.getMonth() + 3) / 3), // 季度
		'w': date.getDay(), // 星期，注意是0-6
		'H': date.getHours(), // 24小时制
		'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
		'm': date.getMinutes(), // 分钟
		's': date.getSeconds(), // 秒
		'S': date.getMilliseconds() // 毫秒
	};
	var week = ['天', '一', '二', '三', '四', '五', '六'];
	for (var i in obj) {
		fmt = fmt.replace(
			new RegExp(i + '+', 'g'),
			function(m) {
				var val = obj[i] + '';
				if (i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
				for (var j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
				return m.length == 1 ? val : val.substring(val.length - m.length);
			}
		);
	}
	return fmt;
}

// 实现多属性组合 实现suk表格的方法  let array = [['白','红'],[1,2],['30px','40px']]
function getCombination(array) {
	let resultArr = [];
	array.forEach((arrItem) => {
	  if (resultArr.length === 0) {
		let firstItem = [];
		arrItem.forEach(item => {
		  firstItem.push([item]);
		})
		resultArr = firstItem
	  } else {
		const emptyArray = [];
		resultArr.forEach((item) => {
		  arrItem.forEach((value) => {
			emptyArray.push([...item, value])
		  })
		})
		resultArr = emptyArray
	  }
	});
	return resultArr;
}
// 防抖
let timeout = null
function debounce(fn, wait){
	if(timeout !== null)  clearTimeout(timeout);
	timeout = setTimeout(function() { typeof fn === 'function' && fn() }, wait);
}

export default {
	Regular,
	random,
	randomScope,
	dataURLtoFile,
	randomString,
	getQueryString,
	getParam,
	sjAdd,
	dateFormat,
	formatDate,
	getCombination,
	debounce
}